package Controller;
//Importante
//http://www.tutorialspoint.com/jsp/jsp_file_uploading.htm

//http://www.java2s.com/Code/Java/Database-SQL-JDBC/InsertpicturetoMySQL.htm
import DTO.Paciente;
import Model.conexionBD;
import java.awt.Image;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.File;
import java.io.FileInputStream;
import java.sql.Blob;
import java.sql.SQLException;
import java.util.ArrayList;

import java.util.List;
import java.util.Iterator;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.ServletContext;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import javax.sql.rowset.serial.SerialBlob;
import javax.sql.rowset.serial.SerialException;
import javax.swing.ImageIcon;

import org.apache.commons.fileupload.DiskFileUpload;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

@WebServlet(name = "ServicioRegistroPaciente", urlPatterns = {"/ServicioRegistroPaciente"})
public class ServicioRegistroPaciente extends HttpServlet {

    static String respuesta = "";
    String nombrePacient;
    String Primer_Apellido;
    String Segund_Apellido;
    String cedula;
    String fechaNacimiento_dia;
    String fechaNacimiento_mes;
    String fechaNacimiento_annio;
    String fechaNacimiento;
    String ocupacion;
    String correo=null;
    String genero;
    String direccion;
    String telefono;
    Blob b1 = null;
    String foto;
    String mimeImagen = null;
    FileInputStream fis;
    File file0;
    Paciente p;

    public static String getRespuesta() {
        return respuesta;
    }

    public static void setRespuesta(String respuesta) {
        ServicioRegistroPaciente.respuesta = respuesta;
    }

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException, FileUploadException {

        foto = request.getParameter("foto");
        
//        request.setCharacterEncoding("utf-8"); /*Ojo a estas dos sig. lineas*/
//        response.setCharacterEncoding("utf-8");
        
        PrintWriter out = response.getWriter();
        try {
            File file;
            int maxFileSize = 100000 * 1024;
            int maxMemSize = 100000 * 1024;
            ServletContext context = getServletConfig().getServletContext();
            String filePath = context.getRealPath("") + File.separator + "img" + File.separator;
            System.out.println("" + getServletConfig());
            // Verify the content type
            String contentType = request.getContentType();
            if ((contentType.indexOf("multipart/form-data") >= 0)) {

                DiskFileItemFactory factory = new DiskFileItemFactory();
                // maximum size that will be stored in memory
                factory.setSizeThreshold(maxMemSize);
                // Location to save data that is larger than maxMemSize.
                factory.setRepository(new File(context.getRealPath("") + File.separator + "img"));
                // Create a new file upload handler
                ServletFileUpload upload = new ServletFileUpload(factory);
                // maximum file size to be uploaded.
                upload.setSizeMax(maxFileSize);

                try {
                    // Parse the request to get file items.
                    List fileItems = upload.parseRequest(request);

                    // Process the uploaded file items
                    Iterator i = fileItems.iterator();

                    out.println("<html>");
                    out.println("<head>");
                    out.println("<title>JSP File upload</title>");
                    out.println("</head>");
                    out.println("<body>");
                    while (i.hasNext()) {
                        FileItem fi = (FileItem) i.next();
                        if (!fi.isFormField()) {
                            // Get the uploaded file parameters
                            String fileName = fi.getName();

                            // Write the file
                            //file = new File(filePath + fileName);

                            //Devuelve el mime cada una de las imagenes que voy a guardar    
                            getExtension(fi.getContentType());
                            llenarImagenes(filePath + fi.getName());
                            b1 = llenaBlob(fi);
                            //fi.write(file);
                            //file0 = file;
                            //fis = new FileInputStream(file);

                        } else {
                            String name = fi.getFieldName();
                            if ("nombrePacient".equals(name)) {
                                nombrePacient = fi.getString();
                            }
                            if ("Primer_Apellido".equals(name)) {
                                Primer_Apellido = fi.getString();
                            }
                            if ("Segund_Apellido".equals(name)) {
                                Segund_Apellido = fi.getString();
                            }
                            if ("cedula".equals(name)) {
                                cedula = fi.getString();
                            }
                            if ("fechaNacimiento_dia".equals(name)) {
                                fechaNacimiento_dia = fi.getString();
                            }
                            if ("fechaNacimiento_mes".equals(name)) {
                                fechaNacimiento_mes = fi.getString();
                            }
                            if ("fechaNacimiento_annio".equals(name)) {
                                fechaNacimiento_annio = fi.getString();
                            }
                            if ("ocupacion".equals(name)) {
                                ocupacion = fi.getString();
                            }
                            if ("correo".equals(name)) {
                                correo = fi.getString();
                            }
                            if ("genero".equals(name)) {
                                genero = fi.getString();
                            }
                            if ("direccion".equals(name)) {
                                direccion = fi.getString();
                            }
                            if ("telefono".equals(name)) {
                                telefono = fi.getString();
                            }


                        }
                    }


                    out.println("</body>");
                    out.println("</html>");
                    validaGeneral(request, response);
                } catch (Exception ex) {
                    System.out.println("Esta es la excepcion que tremendo ");
                    System.out.println(ex);
                }
            } else {
                out.println("<html>");
                out.println("<head>");
                out.println("<title>Servlet upload</title>");
                out.println("</head>");
                out.println("<body>");
                out.println("<p>No file uploaded</p>");
                out.println("</body>");
                out.println("</html>");
            }

        } finally {
            out.close();
        }

    }

    void depura(String cadena, PrintWriter out) {
        out.println("El error es " + cadena + "</p>");
    }

    public void llenarImagenes(String imagen) {
        this.foto = imagen;
    }

    public void getExtension(String valor) {
        this.mimeImagen = valor;
    }

    public Blob llenaBlob(FileItem actual) throws SerialException, SQLException {
        return new SerialBlob(actual.get());

    }

    public void validaTamI(List f, DiskFileUpload fu, HttpServletResponse response) throws IOException {
        if (f.size() == (fu.getSizeMax() - 1000)) {
            respuesta = "LA IMAGEN ES DEMASIADO GRANDE :/";
            response.sendRedirect("index.jsp");
        }
    }

    public void validaItem(FileItem f, HttpServletResponse response) throws IOException {
        if (f.getSize() == 0) {
            respuesta = "NO PUEDES DEJAR ESPACIOS EN BLANCO";
            response.sendRedirect("index.jsp");
        }
    }

    public String extension(String vector) {
        String imagen = vector;
        String[] array = imagen.split("/");
        return array[1];
    }

    public boolean validaExtension(String ext) {
        boolean correcta = false;
        ArrayList<String> exts = new ArrayList<String>();
        exts.add("jpeg");
        exts.add("png");
        exts.add("gif");
        int cont = 0;
        while (exts.size() > cont) {
            if (exts.get(cont).equals(ext)) {
                correcta = true;
            }
            cont++;
        }

        return correcta;
    }

    public void validaGeneral(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        boolean insertado = false;
        try {

            conexionBD c = new conexionBD("root", "root", "SAPCOMED_DATABASE");
            fechaNacimiento = "" + fechaNacimiento_annio + "-" + fechaNacimiento_mes + "-" + fechaNacimiento_dia;

            System.out.println("" + validaExtension(this.extension(mimeImagen)));
           
            
            c.setDirectorio_1(b1);
            c.setFile(fis);
            

            if (b1.length() > 0) {
                p = new Paciente(Integer.parseInt(cedula), nombrePacient, Primer_Apellido, Segund_Apellido, fechaNacimiento,
                        direccion, telefono, ocupacion, correo, genero, null, mimeImagen);
                if (c.buscarPaciente(p.getId_Paciente()) == 0) {
                    if (validaExtension(this.extension(mimeImagen))) {
                        insertado = c.insertarPaciente(p);
                    } else {
                        respuesta = "<div id=\"form_result\" style=\"border:1px solid #D8000C;"
                                + "height:20px;"
                                + "width:678px;"
                                + "padding:4px 0px 0px 20px;"
                                + "background-color:#FFBABA;"
                                + "text-align: center;"
                                + "font-weight: bold;"
                                + "color: #D8000C;"
                                + "font-size: 1.1em;\">"
                                + "<style>  div.growlUI {background: url(img/uncheck.png) no-repeat 10px 10px;} </style>"
                                + "El archivo no es una imagen !!</div>";
                        request.setAttribute("Paciente",p);
                        request.setAttribute("respuesta", respuesta);
                        request.getRequestDispatcher("RegistroFichaPaciente.jsp").forward(request, response);
//                        System.out.println("El archivo no es una imagen .. ");
                    }
                } else {
                    respuesta = "<div id=\"form_result\" style=\"border:1px solid #D8000C;"
                            + "height:20px;"
                            + "width:678px;"
                            + "padding:4px 0px 0px 20px;"
                            + "background-color:#FFBABA;"
                            + "text-align: center;"
                            + "font-weight: bold;"
                            + "color: #D8000C;"
                            + "font-size: 1.1em;\">"
                            + "<style>  div.growlUI {background: url(img/uncheck.png) no-repeat 10px 10px;} </style>"
                            + "Cédula del paciente repetida !!</div>";
                    request.setAttribute("Paciente",p);
                    request.setAttribute("respuesta", respuesta);
                    request.getRequestDispatcher("RegistroFichaPaciente.jsp").forward(request, response);
//                    System.out.println("Usuario duplicado .. con imagen");
                }
            } else {
                p = new Paciente(Integer.parseInt(cedula), nombrePacient, Primer_Apellido, Segund_Apellido, fechaNacimiento,
                        direccion, telefono, ocupacion, correo, genero);
                if (c.buscarPaciente(p.getId_Paciente()) == 0) {
                    insertado = c.insertarPac(p);
                } else {
                    respuesta = "<div id=\"form_result\"  style=\"border:1px solid #D8000C;"
                            + "height:20px;"
                            + "width:678px;"
                            + "padding:4px 0px 0px 20px;"
                            + "background-color:#FFBABA;"
                            + "text-align: center;"
                            + "font-weight: bold;"
                            + "color: #D8000C;"
                            + "font-size: 1.1em;\">"
                            + "<style>  div.growlUI {background: url(img/uncheck.png) no-repeat 10px 10px;} </style>"
                            + "Cédula del paciente repetida !!</div>";
                    request.setAttribute("Paciente",p);
                    request.setAttribute("respuesta", respuesta);
                    request.getRequestDispatcher("RegistroFichaPaciente.jsp").forward(request, response);
//                  System.out.println("Usuario duplicado .. con imagen");
                }
            }
            if (insertado) {
//                request.setAttribute("respuesta", "se registro paciente");
//                request.getRequestDispatcher("RegistroFicha2.jsp?cedula=" + p.getId_Paciente()).forward(request, response);
                 response.sendRedirect("RegistroFicha2.jsp?cedula=" + p.getId_Paciente());
            }

        } catch (Exception e) {
          
            respuesta = "<div id=\"form_result\" style=\"border:1px solid #D8000C;"
                            + "height:20px;"
                            + "width:678px;"
                            + "padding:4px 0px 0px 20px;"
                            + "background-color:#FFBABA;"
                            + "text-align: center;"
                            + "font-weight: bold;"
                            + "color: #D8000C;"
                            + "font-size: 1.1em;\">"
                            + "<style>  div.growlUI {background: url(img/uncheck.png) no-repeat 10px 10px;} </style>"
                            + "Cédula del paciente repetida!!!!</div>";
                    request.setAttribute("Paciente",p);
                    request.setAttribute("respuesta", respuesta);
                    request.getRequestDispatcher("RegistroFichaPaciente.jsp").forward(request, response);
        }
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        try {
            processRequest(request, response);
        } catch (FileUploadException ex) {
            Logger.getLogger(ServicioRegistroPaciente.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}
